/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.datamodel.SolicitudesDynamicDataModel;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dto.SolicitudDto;
import co.com.claro.administracionSolicitudes.ejb.EJBAdminSolicitudesLocal;
import co.com.claro.administracionSolicitudes.entity.EstadosSolicitud;
import co.com.claro.administracionSolicitudes.entity.Solicitud;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import co.com.claro.administracionSolicitudes.entity.UsuariosPorAplicaciones;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import co.com.claro.administracionSolicitudes.entity.enums.EstadosSolicitudEnum;
import co.com.claro.administracionSolicitudes.entity.enums.GruposEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Mike
 */
@ManagedBean
@ViewScoped
public class EjecutarSolicitudBean {

    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;
    @EJB
    private EJBAdminSolicitudesLocal localAdminSol;
    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;

    /**
     * Lista con las solicitudes a ejecutar
     */
    //private List<Solicitud> solicitudesEjecutar;
    private SolicitudesDynamicDataModel solicitudesEjecutar;
    /**
     * Variable que contiene la descipción de la solicitud
     */
    private String descripcionSolicitud;
    /**
     * Variable que contiene el id de la solicitud que va a ejecutar
     */
    private Solicitud solicitudEjecutar;
    /**
     * Variable que contiene la observación del ejecutor
     */
    private String observacionSolicitud;
    /**
     * Variable que almacena comentarios que el ejecutor hace a la solicitud
     */
    private String comentarioSolicitud;
    /**
     * Variable que almacena el user creado en la app solciitada por el usuario
     */
    private String userApp;
    /**
     * Variable que almacena los mensajes a mostrar al usuario
     */
    private String mensaje;
    /**
     * Variable que almacena el primer password que introduce el usuario
     */
    private String password;
    /**
     * Variable que almacena la confirmación del password que introduce el
     * usuario
     */
    private String confirmarPassword;

    private int filas = 30;

    private static final String COL_DEFAULT_SORT = "idSolicitud";

    private String columnaSorteada;
    private boolean ascendiente;

    @PostConstruct
    public void inicializarValores() {
        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = false;

        cargarControles();
    }

    /**
     * Creates a new instance of EjecutarSolicitud
     */
    public EjecutarSolicitudBean() {
    }

    //++++++++++++++++++++++++++++++++ MÉTODOS PROPIOS DEL BEAN ++++++++++++++++++++++++
    /**
     * Método que obtiene el id del objeto contenido dentro del data table y
     * retorna la solicitude de la lista según el rol del usuario
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private Solicitud obtenerObjeto(ActionEvent event, String idComponente) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent(idComponente);
        Long id = (Long) componente.getValueExpression("value").getValue(context.getELContext());

        return localDatabase.findSolicitudById(id);
    }

    /**
     * Método que permite cargar los valores de las solicitudes para asignar
     */
    private void cargarControles() {
        Usuario usuario = sesionBean.getUsuario();
        SolicitudDto dto = new SolicitudDto();

        List<EstadosSolicitudEnum> estados = new ArrayList<EstadosSolicitudEnum>();

        estados.add(EstadosSolicitudEnum.POR_EJECUTAR);

        if (!sesionBean.obtenerRolUsuario().getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())) {
            dto.setIdEjecutor(usuario.getIdUsuario());
        }
        dto.setEstados(estados);
        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);
        solicitudesEjecutar = new SolicitudesDynamicDataModel(localDatabase, dto);
    }

    /**
     * Método que borra los campos cuando se han hecho modificaciones
     */
    private void borrarCampos() {
        descripcionSolicitud = null;
        solicitudEjecutar = null;
        observacionSolicitud = null;
        comentarioSolicitud = null;
        userApp = null;
        mensaje = null;
    }

    /**
     * Método que hace todas las validaciones del password. Si alguna validación
     * no pasa, incluirá un mensaje para mostrarle al usuario
     */
    private boolean isValidoPassword() {
        if (!password.equals(confirmarPassword)) {
            String error = ResourceBundle.getBundle("errores").getString("errorPasswordDiferente");
            incluirMensaje(error);
            return false;
        }
        return true;
    }

    private boolean isValidoFormulario() {
        if (userApp == null || userApp.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorFormularioIncompleto");
            incluirMensaje(error);
            return false;
        }
        if (password == null || password.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorFormularioIncompleto");
            incluirMensaje(error);
            return false;
        }
        if (confirmarPassword == null || confirmarPassword.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorFormularioIncompleto");
            incluirMensaje(error);
            return false;
        }
        return true;
    }

    /**
     * Método que incluye un mensaje para ser desplegado por el pop up al
     * usuario
     *
     * @param mensaje, mensaje que se mostrará al usuario.
     */
    private void incluirMensaje(String mensajeUsuario) {
        mensaje = mensajeUsuario;
    }
    //++++++++++++++++++++++++++++++++ EVENTOS PROPIOS DEL BEAN ++++++++++++++++++++++++

    /**
     * Método que envía la solicitud para su asignación
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para asignación
     */
    public void ejecutarSolicitud(ActionEvent event) {
        solicitudEjecutar = obtenerObjeto(event, "idSolicitudOutputText");

        descripcionSolicitud = solicitudEjecutar.getIdSolicitud() + " - " + solicitudEjecutar.getDescripcion();

    }

    /**
     * Método que asigna la solicitud a un ejecutor
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para asignación
     */
    public void cerrarSolicitud(ActionEvent event) {
        if (!isValidoPassword()) {
            return;
        }
        if (!isValidoFormulario()) {
            return;
        }

        solicitudEjecutar.setUsuario(sesionBean.getUsuario().getUsername());
        solicitudEjecutar.setComentarios(comentarioSolicitud);
        solicitudEjecutar.setObservaciones(observacionSolicitud);

        UsuariosPorAplicaciones uxa = solicitudEjecutar.getUsuarioApp();

        uxa.setUsername(userApp);
        uxa.setActivo(EstadoActividadEnum.ACTIVO.getId());

        solicitudEjecutar.setUsuarioApp(uxa);

        try {
            localAdminSol.ejecutarSolicitud(solicitudEjecutar);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("solicitudEjecutadoOk"));
        } catch (ClaroException ex) {
            incluirMensaje(ex.getMessage());
        }

        cargarControles();
        borrarCampos();
    }

    /**
     * Método que envía la solicitud para su cancelación
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para cancelación
     */
    public void cancelarSolicitud(ActionEvent event) {
        Solicitud solicitudAprobar = obtenerObjeto(event, "idSolicitudOutputText");
//        solicitudAprobar.setIdEjecutor(new Usuario(161));
//        solicitudAprobar.setIdGerencia(new Gerencia((short)0));
        solicitudAprobar.setUsuario(sesionBean.getUsuario().getUsername());
        solicitudAprobar.setEstado(new EstadosSolicitud(EstadosSolicitudEnum.CANCELADO.getId()));

        try {
            localAdminSol.cancelarSolicitud(solicitudAprobar);
        } catch (ClaroException ex) {
            Logger.getLogger(InicioBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        cargarControles();
        borrarCampos();
    }

    public boolean paginado() {
        return solicitudesEjecutar.getTotalCount() > filas;
    }

    public void ordenar() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteada.equals(property)) {
                ascendiente = !ascendiente;
            } else {
                columnaSorteada = property;
                ascendiente = true;
            }
        }

        cargarControles();
    }

    //+++++++++++++++++++++++ GETTERS Y SETTERS +++++++++++++++++++++++++++++++++++
    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public String getDescripcionSolicitud() {
        return descripcionSolicitud;
    }

    public void setDescripcionSolicitud(String descripcionSolicitud) {
        this.descripcionSolicitud = descripcionSolicitud;
    }

    public String getObservacionSolicitud() {
        return observacionSolicitud;
    }

    public void setObservacionSolicitud(String observacionSolicitud) {
        this.observacionSolicitud = observacionSolicitud;
    }

    public String getComentarioSolicitud() {
        return comentarioSolicitud;
    }

    public void setComentarioSolicitud(String comentarioSolicitud) {
        this.comentarioSolicitud = comentarioSolicitud;
    }

    public SolicitudesDynamicDataModel getSolicitudesEjecutar() {
        return solicitudesEjecutar;
    }

    public void setSolicitudesEjecutar(SolicitudesDynamicDataModel solicitudesEjecutar) {
        this.solicitudesEjecutar = solicitudesEjecutar;
    }

//    public List<Solicitud> getSolicitudesEjecutar() {
//        return solicitudesEjecutar;
//    }
//
//    public void setSolicitudesEjecutar(List<Solicitud> solicitudesEjecutar) {
//        this.solicitudesEjecutar = solicitudesEjecutar;
//    }
    public String getUserApp() {
        return userApp;
    }

    public void setUserApp(String userApp) {
        this.userApp = userApp;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getConfirmarPassword() {
        return confirmarPassword;
    }

    public void setConfirmarPassword(String confirmarPassword) {
        this.confirmarPassword = confirmarPassword;
    }

    public int getFilas() {
        return filas;
    }

    public boolean isAscendiente() {
        return ascendiente;
    }

}
